/**
 * 
 */
package com.rhf.core.db.implementations.postgresql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.rhf.core.db.implementations.Base;
import com.rhf.core.db.interfaces.Utilisateur;
import com.rhf.core.dto.UtilisateurVO;

/**
 * @author fabiensaulnier
 * 
 */
public class UtilisateurImp extends Base implements Utilisateur {

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Utilisateur#contructeur(java.sql.ResultSet)
	 */
	public UtilisateurVO contructeur(ResultSet rs) throws Exception {

		UtilisateurVO utilisateurVO = new UtilisateurVO();

		try {
			utilisateurVO.setUtilisateurId(rs.getInt("utilisateur_id"));
			utilisateurVO.setDateCreation(rs.getTimestamp("date_creation"));
			utilisateurVO.setDateModification(rs.getTimestamp("date_modification"));
			utilisateurVO.setAuteurId(rs.getInt("auteur_id"));
			utilisateurVO.setNom(rs.getString("nom"));
			utilisateurVO.setPrenom(rs.getString("prenom"));
			utilisateurVO.setProfilId(rs.getInt("profil_id"));
			utilisateurVO.setEmail(rs.getString("email"));
			utilisateurVO.setLogin(rs.getString("login"));
			utilisateurVO.setMotDePasse(rs.getString("mot_de_passe"));
		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		}

		return utilisateurVO;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @seecom.rhf.dao.interfaces.Utilisateur#ajouterUtilisateur(com.rhf.core.db.
	 * valuesobjects.UtilisateurVO)
	 */
	public int ajouterUtilisateur(UtilisateurVO utilisateurVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requ�te SQL
		String query = "INSERT INTO utilisateur ";
		query += "(date_creation, date_modification, auteur_id, profil_id, nom, prenom, email, login, mot_de_passe) ";
		query += "VALUES (now(), now(), ?, ?, ?, ?, ?, ?, ?)";

		try {

			// Connexion � la base de donn�es
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// D�finition des param�tres (?)
			int i = 1;
			stmt.setInt(i++, utilisateurVO.getAuteurId());
			stmt.setInt(i++, utilisateurVO.getProfilId());
			stmt.setString(i++, utilisateurVO.getNom());
			stmt.setString(i++, utilisateurVO.getPrenom());
			stmt.setString(i++, utilisateurVO.getEmail());
			stmt.setString(i++, utilisateurVO.getLogin());
			stmt.setString(i++, utilisateurVO.getMotDePasse());

			// Ex�cution de la requ�te
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @seecom.rhf.dao.interfaces.Utilisateur#modifierUtilisaterur(com.rhf.core.db.
	 * valuesobjects.UtilisateurVO)
	 */
	public int modifierUtilisateur(UtilisateurVO utilisateurVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requ�te SQL
		String query = "UPDATE utilisateur ";
		query += "SET date_modification = now(), auteurId = ?, profil_id = ?, nom = ?, prenom = ?, email = ?, login = ?, mot_de_passe = ?  ";
		query += "WHERE utilisateur_id = ?";

		try {
			// Connexion � la base de donn�es
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// D�finition des param�tres (?)
			int i = 1;
			stmt.setInt(i++, utilisateurVO.getAuteurId());
			stmt.setInt(i++, utilisateurVO.getProfilId());
			stmt.setString(i++, utilisateurVO.getNom());
			stmt.setString(i++, utilisateurVO.getPrenom());
			stmt.setString(i++, utilisateurVO.getEmail());
			stmt.setString(i++, utilisateurVO.getLogin());
			stmt.setString(i++, utilisateurVO.getMotDePasse());

			stmt.setInt(i++, utilisateurVO.getUtilisateurId());

			// Ex�cution de la requ�te
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Utilisateur#recupererListeUtilisateur()
	 */
	public List<UtilisateurVO> recupererListeUtilisateur() throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		List<UtilisateurVO> list = null;

		// Requ�te SQL
		String query = "SELECT * FROM utilisateur ORDER BY login";

		try {
			// Connexion � la base de donn�es
			conn = getConnection();
			stmt = conn.prepareStatement(query);

			// Ex�cution de la requ�te
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des donn�es
			if (rs.next()) {
				list = new ArrayList<UtilisateurVO>();
				list.add(this.contructeur(rs));
				while (rs.next()) {
					list.add(this.contructeur(rs));
				}
			}
		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return list;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Utilisateur#recupererUtilisateur(int)
	 */
	public UtilisateurVO recupererUtilisateur(int utilisateurId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		UtilisateurVO utilisateurVO = null;

		// Requ�te SQL
		String query = "SELECT * ";
		query += "FROM utilisateur ";
		query += "WHERE utilisateur_id = ?";

		try {
			// Connexion � la base de donn�es
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// D�finition des param�tres (?)
			stmt.setInt(1, utilisateurId);

			// Ex�cution de la requ�te
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des donn�es
			if (rs.next()) {
				utilisateurVO = this.contructeur(rs);
			}
		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return utilisateurVO;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Utilisateur#supprimerUtilisateur(int)
	 */
	public int supprimerUtilisateur(int utilisateurId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requ�te SQL
		String query = "DELETE FROM utilisateur ";
		query += "WHERE utilisateur_id = ? ";

		try {
			// Connexion � la base de donn�es
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// D�finition des param�tres (?)
			stmt.setInt(1, utilisateurId);

			// Ex�cution de la requ�te
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();
		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.rhf.core.db.interfaces.Utilisateur#recupererUtilisateur(java.lang.String,
	 * java.lang.String)
	 */
	public UtilisateurVO recupererUtilisateur(String login, String motDePasse) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		UtilisateurVO utilisateurVO = null;

		// Requ�te SQL
		String query = "SELECT * ";
		query += "FROM utilisateur ";
		query += "WHERE login = ? ";
		query += "AND mot_de_passe = ? ";

		try {
			// Connexion � la base de donn�es
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// D�finition des param�tres (?)
			int i = 1;
			stmt.setString(i++, login);
			stmt.setString(i++, motDePasse);

			// Ex�cution de la requ�te
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des donn�es
			if (rs.next()) {
				utilisateurVO = this.contructeur(rs);
			}
		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return utilisateurVO;

	}
}
